
Anh Tuan
Data Science Expert

Khi trợ lý AI của bạn tự động hóa các nhiệm vụ trên web, CAPTCHA là rào cản số một. Các trang được bảo vệ sẽ không gửi, quy trình đăng nhập bị treo, và toàn bộ chu trình tự động hóa dừng lại chờ người dùng.
Nanobot là khung phần mềm trợ lý AI cá nhân siêu nhẹ có thể chạy trên phần cứng của bạn. Nó kết nối với các kênh bạn đã sử dụng — WhatsApp, Telegram, Discord, Slack, Email và nhiều hơn nữa — và đi kèm với công cụ exec tích hợp cho phép trợ lý viết và chạy script tự động.
CapSolver cung cấp API giải CAPTCHA được hỗ trợ bởi AI. Bằng cách kết hợp khả năng thực thi script của Nanobot với API REST của CapSolver, trợ lý của bạn có thể phát hiện CAPTCHA, giải chúng, chèn token và gửi biểu mẫu — tất cả mà không cần can thiệp của con người.
Điều tuyệt nhất? Bạn chỉ cần nói với trợ lý điều bạn muốn thực hiện bằng ngôn ngữ thông thường. Nó sẽ viết script Playwright, trích xuất sitekey, gọi CapSolver, chèn token và gửi biểu mẫu — tất cả tự động.
Nanobot là khung phần mềm trợ lý AI cá nhân với khoảng 3.500 dòng mã Python cốt lõi. Nó được thiết kế để nhẹ, dễ mở rộng và tự lưu trữ.

Công cụ exec của Nanobot là yếu tố khiến tự động hóa trình duyệt có thể thực hiện được. Trợ lý có thể chạy bất kỳ lệnh shell nào, bao gồm các script Node.js điều khiển trình duyệt không đầu. Khi bạn yêu cầu trợ lý tương tác với một trang web, nó:
execHãy tưởng tượng bạn đang cấp quyền truy cập dòng lệnh đầy đủ cho trợ lý AI — nó có thể cài đặt công cụ, viết script và thực thi chúng, tất cả từ một chỉ định bằng ngôn ngữ tự nhiên.
CapSolver là dịch vụ giải CAPTCHA hàng đầu cung cấp các giải pháp được hỗ trợ bởi AI để vượt qua các thách thức CAPTCHA khác nhau. Với sự hỗ trợ cho nhiều loại CAPTCHA và thời gian phản hồi nhanh, CapSolver tích hợp liền mạch vào các quy trình tự động hóa.
Hầu hết các tích hợp giải CAPTCHA rơi vào hai loại: tích hợp API cấp mã nơi bạn viết một lớp dịch vụ chuyên dụng, hoặc mở rộng trình duyệt nơi một tiện ích mở rộng Chrome xử lý mọi thứ một cách vô hình. Nanobot chọn cách thứ ba: tích hợp API do trợ lý điều khiển.
Trợ lý AI tự mình điều phối toàn bộ quy trình giải CAPTCHA một cách tự động — viết script Playwright, trích xuất sitekey, gọi API CapSolver và chèn token giải pháp — tất cả thông qua các script mà nó viết và thực thi theo yêu cầu.
| Cách tiếp cận bằng tiện ích mở rộng trình duyệt | Cách tiếp cận do trợ lý điều khiển của Nanobot |
|---|---|
| Yêu cầu cài đặt tiện ích mở rộng Chrome | Không cần tiện ích mở rộng — chỉ cần khóa API |
| Cần phiên bản Chrome tương thích | Hoạt động với bất kỳ trình duyệt không đầu nào |
| Tiện ích mở rộng phát hiện CAPTCHA tự động | Trợ lý trích xuất sitekey từ DOM trang |
| Tiện ích mở rộng gọi API ở nền | Trợ lý gọi API REST của CapSolver trực tiếp |
| Yêu cầu màn hình hiển thị (Xvfb trên máy chủ) | Chạy hoàn toàn không đầu, không cần màn hình |
Điểm mấu chốt: Trợ lý của Nanobot không cần tiện ích mở rộng trình duyệt vì nó có thể gọi API CapSolver một cách chương trình, trích xuất sitekey từ DOM trang và chèn token giải pháp — tất cả thông qua các script Playwright mà nó thực thi qua công cụ exec. Điều này hoạt động trong môi trường hoàn toàn không đầu mà không cần thiết lập màn hình.
Lưu ý: Các ví dụ dưới đây được kiểm tra trên Ubuntu 22.04 / 24.04. Các lệnh sử dụng
aptvàbash— điều chỉnh cho phân phối của bạn nếu cần.
Trước khi thiết lập tích hợp, hãy đảm bảo bạn có:
sudo apt install python3 python3-pip python3-venv)pip install nanobot-ai hoặc pip install -e ".[dev]")# Cài đặt từ PyPI
pip install nanobot-ai
# Hoặc cài đặt từ nguồn cho phát triển
git clone https://github.com/HKUDS/nanobot.git
cd nanobot
pip install -e ".[dev]"
# Khởi tạo cấu hình và không gian làm việc
nanobot onboard
Thêm khóa API CapSolver của bạn dưới dạng biến môi trường:
export CAPSOLVER_API_KEY="CAP-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Bạn có thể nhận khóa API từ bảng điều khiển CapSolver của mình (https://www.capsolver.com/?utm_source=official&utm_medium=blog&utm_campaign=nanobot).
Để cấu hình bền vững, thêm nó vào hồ sơ shell của bạn (~/.bashrc hoặc ~/.zshrc).
Cài đặt Playwright và các phụ thuộc hệ thống trên Ubuntu:
# Cài đặt phụ thuộc trình duyệt Playwright (Ubuntu)
sudo apt install -y libnss3 libatk-bridge2.0-0 libdrm2 libxcomposite1 \
libxdamage1 libxrandr2 libgbm1 libpango-1.0-0 libasound2t64
# Cài đặt Playwright trong không gian làm việc nanobot
cd ~/.nanobot/workspace
npm init -y
npm install playwright
npx playwright install chromium
# Khởi động dịch vụ kênh (Telegram, Discord, v.v.)
nanobot gateway
# Hoặc để kiểm tra tương tác
nanobot agent
Gửi một tin nhắn kiểm tra đến trợ lý của bạn qua bất kỳ kênh nào đã kết nối:
Bạn có những công cụ nào sẵn có?
Trợ lý nên liệt kê exec trong số các công cụ của nó — đây là cách nó chạy script tự động hóa trình duyệt.
Nanobot bao gồm một kỹ năng capsolver tích hợp sẵn mà luôn được tải vào prompt hệ thống của trợ lý. Điều này có nghĩa là mỗi lần người dùng gửi tin nhắn, trợ lý đã có tài liệu API CapSolver đúng, loại nhiệm vụ, mẫu mã code và hướng dẫn thực thi trong ngữ cảnh — nó không bao giờ phải đoán hoặc tra cứu.
Kỹ năng là các tệp markdown tại nanobot/skills/{name}/SKILL.md với phần frontmatter YAML. Khi always: true được đặt trong metadata, nội dung kỹ năng đầy đủ được chèn tự động vào prompt hệ thống của trợ lý. Trợ lý không cần gọi read_file — nó chỉ cần biết.
nanobot/skills/capsolver/SKILL.md)Để cài đặt kỹ năng, tạo tệp nanobot/skills/capsolver/SKILL.md với nội dung sau:
---
name: capsolver
description: "Giải CAPTCHA bằng API REST của CapSolver với Playwright. Hỗ trợ reCAPTCHA v2, reCAPTCHA v3 và Cloudflare Turnstile. Sử dụng khi tự động hóa việc gửi biểu mẫu hoặc tương tác trang gặp phải thách thức CAPTCHA."
metadata: {"nanobot":{"emoji":"🔓","always":true,"requires":{"bins":["node"],"env":["CAPSOLVER_API_KEY"]}}}
---
# CapSolver
## LƯU Ý: THỰC THI BẮT BUỘC
Khi người dùng yêu cầu bạn giải CAPTCHA, bạn **phải gọi công cụ ngay lập tức**. Đừng trả lời bằng văn bản như "Đang chạy..." hoặc "Tôi sẽ bắt đầu..." hoặc "Tôi đã bắt đầu tự động hóa...".
Hành động đầu tiên của bạn phải là:
1. Gọi `write_file` để lưu script Node.js, sau đó gọi `exec` để chạy nó
2. Gọi `spawn` với mô tả nhiệm vụ chi tiết để thực thi nền
Nếu bạn chỉ trả lời bằng văn bản mà không có gọi công cụ, người dùng sẽ không thấy bất kỳ điều gì xảy ra. Luôn thực thi.
## Các điểm cuối API
- **Tạo nhiệm vụ**: `POST https://api.capsolver.com/createTask`
- **Lấy kết quả**: `POST https://api.capsolver.com/getTaskResult`
## Loại nhiệm vụ
| CAPTCHA | Loại nhiệm vụ | Vị trí sitekey |
|---|---|---|
| reCAPTCHA v2 | `ReCaptchaV2TaskProxyLess` | thuộc tính `data-sitekey` |
| reCAPTCHA v3 | `ReCaptchaV3TaskProxyLess` | cuộc gọi `grecaptcha.execute` hoặc nguồn trang |
| Cloudflare Turnstile | `AntiTurnstileTaskProxyLess` | `data-sitekey` trên div Turnstile |
Phiên bản doanh nghiệp: `ReCaptchaV2EnterpriseTaskProxyLess`, `ReCaptchaV3EnterpriseTaskProxyLess`.
## Quy trình làm việc
1. Điều hướng đến trang bằng Playwright (Chromium không đầu)
2. Trích xuất sitekey từ DOM (`[data-sitekey]` thuộc tính)
3. Gọi `createTask` với sitekey và URL trang
4. Lặp lại `getTaskResult` mỗi 2 giây cho đến khi `status: "ready"`
5. Chèn token vào trang (trường biểu mẫu ẩn)
6. Gửi biểu mẫu
## Mẫu mã cốt lõi
```javascript
const CAPSOLVER_API_KEY = process.env.CAPSOLVER_API_KEY;
// Bước 1: Tạo nhiệm vụ
const createRes = await fetch('https://api.capsolver.com/createTask', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
clientKey: CAPSOLVER_API_KEY,
task: {
type: 'ReCaptchaV2TaskProxyLess', // hoặc ReCaptchaV3TaskProxyLess, AntiTurnstileTaskProxyLess
websiteURL: pageUrl,
websiteKey: siteKey
}
})
});
const { taskId } = await createRes.json();
// Bước 2: Lặp lại để lấy kết quả
let token;
while (true) {
await new Promise(r => setTimeout(r, 2000));
const res = await fetch('https://api.capsolver.com/getTaskResult', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ clientKey: CAPSOLVER_API_KEY, taskId })
});
const result = await res.json();
if (result.status === 'ready') { token = result.solution.gRecaptchaResponse || result.solution.token; break; }
if (result.status === 'failed') throw new Error('Giải thất bại');
}
// Bước 3: Chèn token (reCAPTCHA)
await page.evaluate((t) => {
document.querySelectorAll('textarea[name="g-recaptcha-response"]')
.forEach(el => { el.value = t; el.innerHTML = t; });
}, token);
```
Đối với Turnstile, trường token thường là `input[name="cf-turnstile-response"]` và giải pháp nằm trong `result.solution.token`.
## Tài liệu API đầy đủ
Xem `{baseDir}/references/api.md` để có tài liệu tham khảo đầy đủ về tham số, trường tùy chọn và phản hồi ví dụ cho tất cả các loại nhiệm vụ.
Điểm chính:
always: true đảm bảo kỹ năng này được tải vào mỗi cuộc trò chuyện — trợ lý luôn có tài liệu API trong ngữ cảnhrequires kiểm tra xem node có được cài đặt và CAPSOLVER_API_KEY có được thiết lập khôngreferences/api.md)Kỹ năng cũng bao gồm tài liệu API đầy đủ mà trợ lý có thể đọc khi cần để có tài liệu tham khảo chi tiết về tham số. Dưới đây là những gì nó bao gồm:
Tham số bắt buộc: type, websiteURL, websiteKey
Tham số tùy chọn: isInvisible (Boolean), pageAction (String), recaptchaDataSValue (String), enterprisePayload (Object), apiDomain (String)
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": "https://www.google.com/recaptcha/api2/demo",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"isInvisible": false
}
}
Token phản hồi: solution.gRecaptchaResponse → chèn vào textarea[name="g-recaptcha-response"]
Tham số bắt buộc: type, websiteURL, websiteKey
Tham số tùy chọn: pageAction (String — từ grecaptcha.execute(key, {action: "..."}), các giá trị phổ biến: login, submit, homepage), enterprisePayload (Object), apiDomain (String)
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "ReCaptchaV3TaskProxyLess",
"websiteURL": "https://www.example.com",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_kl-",
"pageAction": "login"
}
}
Token phản hồi: solution.gRecaptchaResponse → chèn vào textarea[name="g-recaptcha-response"]
Tham số bắt buộc: type (AntiTurnstileTaskProxyLess), websiteURL, websiteKey
Tham số tùy chọn: metadata.action (String — từ thuộc tính data-action), metadata.cdata (String — từ thuộc tính data-cdata)
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "AntiTurnstileTaskProxyLess",
"websiteURL": "https://www.example.com",
"websiteKey": "0x4XXXXXXXXXXXXXXXXX",
"metadata": {
"action": "login",
"cdata": "0000-1111-2222-3333-example-cdata"
}
}
}
Token phản hồi: solution.token → chèn vào input[name="cf-turnstile-response"]
| Loại CAPTCHA | Thời gian giải |
|---|---|
| reCAPTCHA v2 | 1-10 giây |
| reCAPTCHA v3 | 1-10 giây |
| Cloudflare Turnstile | 1-20 giây |
Khi bạn yêu cầu Nanobot tương tác với trang web bị bảo vệ bởi CAPTCHA, đây là những gì xảy ra bên trong:
Tin nhắn của bạn Trợ lý Nanobot
────────────────────────────────────────────────────
"Đi đến trang đó, ──► Trợ lý nhận được tin nhắn
điền biểu mẫu, │
giải CAPTCHA, ▼
và gửi nó" Trợ lý viết script tự động hóa
│
▼
công cụ exec chạy script
┌─────────────────────────────────┐
│ Chromium không đầu │
│ │
│ 1. Điều hướng đến trang đích │
│ 2. Trích xuất sitekey từ DOM │
│ (thuộc tính data-sitekey) │
│ │
│ 3. Gọi API CapSolver REST: │
│ POST /createTask │
│ POST /getTaskResult (poll) │
│ │
│ 4. Chèn token vào các trường │
│ textarea/input ẩn │
│ │
│ 5. Nhấn Submit │
│ 6. Xác minh thành công │
│ 7. Chụp màn hình │
└─────────────────────────────────┘
│
▼
Agent đọc đầu ra + ảnh chụp màn hình
│
▼
"Biểu mẫu đã được gửi thành công!
Trang hiển thị: Xác minh
Thành công... Hooray!"
### Luồng API của CapSolver
Nội dung cốt lõi của tích hợp là hai cuộc gọi API:
**1. Tạo một nhiệm vụ** — Gửi sitekey CAPTCHA và URL trang web đến CapSolver:
```javascript
const response = await fetch('https://api.capsolver.com/createTask', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
clientKey: CAPSOLVER_API_KEY,
task: {
type: 'ReCaptchaV2TaskProxyLess',
websiteURL: pageUrl,
websiteKey: siteKey
}
})
});
2. Kiểm tra kết quả — Kiểm tra mỗi 2 giây cho đến khi CapSolver trả về token đã giải:
const result = await fetch('https://api.capsolver.com/getTaskResult', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
clientKey: CAPSOLVER_API_KEY,
taskId: taskId
})
});
// result.solution.gRecaptchaResponse chứa token
3. Chèn token — Thiết lập nó vào trường biểu mẫu ẩn mà reCAPTCHA mong đợi:
await page.evaluate((token) => {
const textarea = document.querySelector('textarea[name="g-recaptcha-response"]');
if (textarea) {
textarea.value = token;
textarea.innerHTML = token;
}
}, captchaToken);
Đây là đoạn mã thực tế mà agent của Nanobot tạo ra và thực thi để giải CAPTCHA trên trang demo của Google. Agent viết đoạn mã này bằng write_file, sau đó chạy nó với exec — tất cả tự động từ một tin nhắn Discord:
const { chromium } = require('playwright');
const https = require('https');
const CAPSOLVER_API_KEY = process.env.CAPSOLVER_API_KEY;
const PAGE_URL = 'https://www.google.com/recaptcha/api2/demo';
function httpsPost(url, data) {
return new Promise((resolve, reject) => {
const req = https.request(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' }
}, (res) => {
let body = '';
res.on('data', chunk => body += chunk);
res.on('end', () => resolve(JSON.parse(body)));
});
req.on('error', reject);
req.write(JSON.stringify(data));
req.end();
});
}
async function solveRecaptcha(siteKey, pageUrl) {
console.log('Tạo nhiệm vụ Capsolver...');
const createRes = await httpsPost('https://api.capsolver.com/createTask', {
clientKey: CAPSOLVER_API_KEY,
task: {
type: 'ReCaptchaV2TaskProxyLess',
websiteURL: pageUrl,
websiteKey: siteKey
}
});
const { taskId } = createRes;
console.log(`ID nhiệm vụ: ${taskId}`);
let token;
while (true) {
await new Promise(r => setTimeout(r, 2000));
const res = await httpsPost('https://api.capsolver.com/getTaskResult', {
clientKey: CAPSOLVER_API_KEY,
taskId
});
if (res.status === 'ready') {
token = res.solution.gRecaptchaResponse;
console.log(`Token nhận được! Độ dài: ${token.length}`);
break;
}
if (res.status === 'failed') {
throw new Error('Nhiệm vụ Capsolver thất bại');
}
}
if (!token) throw new Error('Không thể nhận token');
return token;
}
async function main() {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
console.log('Đang điều hướng đến trang...');
await page.goto(PAGE_URL, { waitUntil: 'domcontentloaded', timeout: 30000 });
console.log('Trích xuất sitekey...');
const siteKey = await page.locator('[data-sitekey]').getAttribute('data-sitekey');
console.log(`Sitekey: ${siteKey}`);
console.log('Giải CAPTCHA bằng Capsolver...');
const token = await solveRecaptcha(siteKey, PAGE_URL);
console.log('Chèn token...');
await page.evaluate((t) => {
document.querySelectorAll('textarea[name="g-recaptcha-response"])
.forEach(el => { el.value = t; el.innerHTML = t; });
}, token);
console.log('Gửi biểu mẫu...');
await page.locator('input[type="submit"]').click();
console.log('Chờ kết quả...');
await page.waitForTimeout(3000);
const successText = await page.textContent('body');
if (successText.includes('Thành công') || successText.includes('Xác minh')) {
console.log('\n✅ THÀNH CÔNG! CAPTCHA đã được giải và biểu mẫu đã được gửi!');
console.log('Thông báo thành công:', successText.slice(0, 200));
} else {
console.log('\n❌ Kết quả không rõ ràng. Nội dung trang:', successText.slice(0, 300));
}
await page.screenshot({ path: 'recaptcha_result.png' });
console.log('Ảnh chụp màn hình được lưu tại recaptcha_result.png');
await browser.close();
}
main().catch(console.error);
Chạy nó:
CAPSOLVER_API_KEY=CAP-XXX node solve_recaptcha.js
Sau khi cài đặt xong, sử dụng CapSolver với Nanobot đơn giản chỉ cần gửi một tin nhắn.
Gửi tin nhắn này đến agent của bạn qua Telegram, Discord, WhatsApp, hoặc bất kỳ kênh nào đã kết nối:
Truy cập https://www.google.com/recaptcha/api2/demo và giải CAPTCHA
bằng API CapSolver, sau đó gửi biểu mẫu
và cho tôi biết liệu nó có thành công không.
Các bước thực hiện:
createTask của CapSolver với sitekeygetTaskResult mỗi 2 giây cho đến khi token sẵn sàng (~18 giây)g-recaptcha-response ẩnTruy cập https://example.com/login, điền email là
"me@example.com" và mật khẩu là "mypassword", phát hiện và
giải bất kỳ CAPTCHA nào trên trang,
sau đó nhấn Đăng nhập và cho tôi biết điều gì xảy ra.
Mở https://example.com/contact, điền vào các trường tên, email và
nội dung, giải CAPTCHA, gửi biểu mẫu và cho tôi biết
thông báo xác nhận.
Vì agent của Nanobot có:
exec — chạy bất kỳ lệnh shell nào, bao gồm cả các đoạn mã Node.jsweb_fetch — truy xuất nội dung trang để hiểu cấu trúc trangcapsolver — luôn được nạp vào ngữ cảnh của agent (xem Kỹ năng CapSolver tích hợp phía trên), bao gồm các loại nhiệm vụ, mẫu mã, tài liệu tham khảo API và hướng dẫn thực thi đảm bảo agent tạo và chạy các đoạn mã thay vì chỉ mô tả những gì nó sẽ làmMột thách thức với các agent dựa trên LLM là một số mô hình trả lời bằng văn bản như "Đang chạy tự động hóa ngay bây giờ..." mà không thực sự gọi bất kỳ công cụ nào. Người dùng thấy một tin nhắn dường như tiến triển, nhưng không có hành động nào xảy ra phía sau.
Nanobot giải quyết vấn đề này bằng cơ chế thử lại khi bị ảo tưởng được tích hợp vào vòng lặp agent. Khi LLM trả lời bằng văn bản trong lần lặp đầu tiên và nội dung đó chứa các cụm từ hành động như "đang chạy ngay bây giờ", "tôi đã bắt đầu", hoặc "đang thực thi" — nhưng không thực hiện bất kỳ cuộc gọi công cụ nào, Nanobot phát hiện điều này và tự động gửi một tin nhắn sửa đổi:
"Bạn đã mô tả bắt đầu một nhiệm vụ nhưng không gọi bất kỳ công cụ nào. Người dùng không thể thấy tiến trình của bạn trừ khi bạn sử dụng các công cụ như exec, write_file hoặc spawn. Vui lòng gọi công cụ phù hợp ngay bây giờ để thực hiện nhiệm vụ."
LLM sau đó thử lại và gọi công cụ thực tế (ví dụ: spawn để khởi chạy một nhiệm vụ tự động hóa nền). Điều này xảy ra một cách tự động — người dùng chỉ thấy kết quả xuất hiện vài giây sau.
Đây là tính năng chung của Nanobot giúp cải thiện độ tin cậy cho tất cả các nhiệm vụ sử dụng công cụ, không chỉ riêng giải CAPTCHA.
Để kích hoạt cơ chế thử lại khi bị ảo tưởng và các cải tiến độ tin cậy khác, áp dụng ba thay đổi sau vào cài đặt Nanobot của bạn:
1. Thử lại khi bị ảo tưởng (nanobot/agent/loop.py)
Trong phương thức _process_message, thay nhánh else xử lý các phản hồi không gọi công cụ:
else:
# Không có cuộc gọi công cụ — nhưng kiểm tra xem LLM có mô tả hành động mà không gọi công cụ không
if iteration == 1 and self._seems_like_hallucinated_action(response.content):
logger.warning("LLM mô tả hành động mà không gọi công cụ — đang thử lại với thông báo sửa đổi")
messages.append({"role": "assistant", "content": response.content})
messages.append({
"role": "user",
"content": (
"[Hệ thống: Bạn đã mô tả bắt đầu một nhiệm vụ nhưng không gọi bất kỳ công cụ nào. "
"Người dùng không thể thấy tiến trình của bạn trừ khi bạn sử dụng các công cụ như exec, "
"write_file hoặc spawn. Vui lòng gọi công cụ phù hợp ngay bây giờ để "
"thực hiện nhiệm vụ.]"
),
})
continue
final_content = response.content
break
Và thêm phương thức phát hiện này vào lớp AgentLoop:
@staticmethod
def _seems_like_hallucinated_action(content: str | None) -> bool:
"""Phát hiện xem LLM có mô tả bắt đầu một hành động mà không gọi công cụ không."""
if not content:
return False
lower = content.lower()
phrases = [
"đang chạy ngay bây giờ", "tôi đã bắt đầu", "tôi sẽ bắt đầu", "bắt đầu nhiệm vụ",
"tôi đã bắt đầu", "tôi sẽ bắt đầu", "đang thực thi", "tôi đang xử lý",
"hãy để tôi chạy", "đang chạy", "tôi đã khởi động", "đã khởi chạy",
"tôi đã khởi tạo", "đang xử lý",
]
return any(phrase in lower for phrase in phrases)
2. Kỹ năng trong Subagent (nanobot/agent/subagent.py)
Không có thay đổi này, các subagent được khởi chạy qua công cụ spawn sẽ không có kỹ năng capsolver trong ngữ cảnh của chúng. Thêm import và chèn kỹ năng luôn được nạp vào prompt subagent:
# Thêm import
from nanobot.agent.skills import SkillsLoader
# Trong __init__, thêm:
self._skills = SkillsLoader(workspace)
# Cuối cùng của _build_subagent_prompt(), trước khi return:
always_skills = self._skills.get_always_skills()
if always_skills:
skills_content = self._skills.load_skills_for_context(always_skills)
if skills_content:
prompt += f"\n\n## Tài liệu tham khảo\n\n{skills_content}"
return prompt
3. Thời gian chờ exec (nanobot/config/schema.py)
Các đoạn mã tự động hóa trình duyệt cần nhiều hơn 60 giây mặc định — việc kiểm tra API CapSolver có thể mất 20 giây trở lên. Tăng thời gian chờ:
class ExecToolConfig(BaseModel):
"""Cấu hình công cụ exec shell."""
timeout: int = 120 # trước đây là 60
Sau khi áp dụng các thay đổi này, khởi động lại Nanobot (pm2 restart nanobot hoặc chạy lại dịch vụ.
Chúng tôi đã kiểm tra tích hợp này trên trang demo reCAPTCHA v2 của Google. Dưới đây là các kết quả thực tế từ lần chạy thử nghiệm của chúng tôi:
| Chỉ số | Giá trị |
|---|---|
| Tư duy của agent + tạo mã | ~10 giây |
| Thực thi mã (tổng cộng) | ~34 giây |
| Tải trang (domcontentloaded) | ~2 giây |
| Trích xuất sitekey | < 1 giây |
| Giải CAPTCHA (API CapSolver) | ~20 giây |
| Chèn token + gửi biểu mẫu | ~3 giây |
| Xác minh thành công + chụp màn hình | ~3 giây |
| Toàn bộ (tin nhắn → phản hồi) | ~45 giây |
| Kết quả | Xác minh thành công |
Agent đã lưu một ảnh chụp màn hình cuối cùng (recaptcha_result.png) hiển thị trang thành công sau khi gửi biểu mẫu.
Playwright chưa được cài đặt trong không gian làm việc. Chạy:
cd ~/.nanobot/workspace && npm install playwright && npx playwright install chromium
Nếu Chromium không thể khởi chạy với các lỗi về thư viện chia sẻ bị thiếu, cài đặt các thư viện hệ thống:
sudo apt install -y libnss3 libatk-bridge2.0-0 libdrm2 libxcomposite1 \
libxdamage1 libxrandr2 libgbm1 libpango-1.0-0 libasound2t64
ready hoặc failed — nếu nó treo, kiểm tra khóa API và số dư của bạnĐoạn mã trích xuất sitekey từ thuộc tính data-sitekey trên phần tử DOM reCAPTCHA. Nếu không tìm thấy phần tử nào có data-sitekey, trang có thể nhúng khóa theo cách khác — agent có thể viết một đoạn mã sửa đổi để trích xuất nó từ URL iframe hoặc nguồn trang khi cần.
Thêm các cờ này vào tùy chọn khởi chạy Playwright:
chromium.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage']
});
Đảm bảo biến môi trường CAPSOLVER_API_KEY được thiết lập trước khi khởi chạy Nanobot. Agent kiểm tra nó khi chạy script.
Không nên ghi cứng khóa trong script. Sử dụng process.env.CAPSOLVER_API_KEY để agent có thể tự động nhận được.
Cách tiếp cận API của Nanobot hoạt động trong môi trường hoàn toàn không đầu — không cần Xvfb hoặc màn hình ảo. Đây là lợi thế lớn so với các cách tiếp cận dựa trên tiện ích mở rộng.
Mỗi lần giải CAPTCHA sẽ tiêu tốn tín dụng. Hãy kiểm tra số dư của bạn thường xuyên tại capsolver.com/dashboard.
Các nhà cung cấp CAPTCHA liên tục phát triển. Hãy cập nhật Playwright và Chromium để tránh các vấn đề phát hiện:
cd ~/.nanobot/workspace && npm update playwright && npx playwright install chromium
Tích hợp Nanobot + CapSolver tiếp cận vấn đề CAPTCHA theo cách hoàn toàn khác so với các giải pháp dựa trên tiện ích mở rộng. Thay vì tải tiện ích mở rộng Chrome, trí tuệ nhân tạo (AI) sẽ điều phối toàn bộ quy trình giải CAPTCHA:
data-sitekeyĐiều này mang lại cho bạn:
Sẵn sàng bắt đầu? Đăng ký CapSolver và sử dụng mã thưởng NANOBOT để nhận thêm 6% thưởng cho lần nạp đầu tiên!

Nanobot sử dụng trực tiếp API REST của CapSolver. Trí tuệ nhân tạo viết và thực thi các tập lệnh gọi createTask và getTaskResult để nhận mã giải, sau đó chèn chúng vào DOM trang. Không cần tiện ích mở rộng trình duyệt.
Không. Khác với các phương pháp dựa trên tiện ích mở rộng yêu cầu Chrome for Testing (vì Chrome có thương hiệu 137+ đã vô hiệu hóa việc tải tiện ích mở rộng), Nanobot hoạt động với bất kỳ bản Chromium nào — bao gồm Chromium được tích hợp trong Playwright, các gói Chromium tiêu chuẩn, hoặc thậm chí Chrome không giao diện.
CapSolver hỗ trợ reCAPTCHA v2 (hộp kiểm và ẩn), reCAPTCHA v3, Cloudflare Turnstile, AWS WAF CAPTCHA, và nhiều loại khác. Chúng tôi đã kiểm tra tích hợp Nanobot với reCAPTCHA v2 sử dụng loại nhiệm vụ ReCaptchaV2TaskProxyLess. Đối với các loại CAPTCHA khác, trí tuệ nhân tạo có thể viết tập lệnh sử dụng loại nhiệm vụ CapSolver phù hợp — xem tài liệu CapSolver để xem danh sách đầy đủ.
Có — và đây chính là điểm mạnh của cách tiếp cận Nanobot. Vì không có tiện ích mở rộng trình duyệt, bạn không cần Xvfb hoặc màn hình ảo. Playwright chạy ở chế độ không giao diện hoàn toàn.
CapSolver cung cấp giá cả cạnh tranh dựa trên loại CAPTCHA và khối lượng. Truy cập capsolver.com để xem giá hiện tại.
Nanobot là mã nguồn mở và miễn phí để chạy trên phần cứng của bạn. Bạn sẽ cần khóa API từ nhà cung cấp mô hình AI bạn chọn và, để giải CAPTCHA, một tài khoản CapSolver với tín dụng.
Trong thử nghiệm với reCAPTCHA v2, API CapSolver trả về kết quả trong khoảng 20 giây. Trí tuệ nhân tạo kiểm tra mỗi 2 giây và tiếp tục ngay khi mã token sẵn sàng. Thời gian thực thi tập lệnh tổng thể (truy cập + giải + chèn + gửi) là khoảng 34 giây, và thời gian toàn bộ từ tin nhắn đến phản hồi là khoảng 45 giây bao gồm cả việc trí tuệ nhân tạo viết tập lệnh.
Học kiến trúc gỡ mã web Rust có thể mở rộng với reqwest, scraper, gỡ mã bất đồng bộ, gỡ mã trình duyệt không đầu, xoay proxy và xử lý CAPTCHA tuân thủ.

Hiểu về Dịch vụ Dữ liệu (DaaS) vào năm 2026. Khám phá lợi ích, trường hợp sử dụng và cách nó thay đổi doanh nghiệp với phân tích thời gian thực và tính mở rộng.
